/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ipti.br.tag.pdf;

import org.ipti.br.tag.bo.HbBO;
import org.ipti.br.tag.bo.WeightAndHeightBO;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import org.ipti.br.tag.entity.Hb;
import org.ipti.br.tag.entity.Human;
import org.ipti.br.tag.entity.Organization;
import org.ipti.br.tag.entity.WeightAndHeight;
import org.ipti.br.tag.entity.enums.Sex;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import java.util.Locale;
import javax.ejb.Stateless;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import org.ipti.br.tag.bean.dataManipulation.HumanHbMeasure;
import org.ipti.br.tag.util.CalendarUtil;
import org.ipti.br.tag.util.ServiceUtil;

/**
 *
 * @author luancorumba
 */
@Stateless
public class AnamnesePDF extends AbstractPdf implements Serializable {
    
    @Inject private WeightAndHeightBO weightAndHeightBO;
    @Inject private HbBO hbBO;
    
    private Organization organization;

    public void run(Organization org, List<HumanHbMeasure> anemics)
            throws FileNotFoundException, DocumentException, IOException {
        this.organization = org;
        
        this.init("Anamnese - "+ org.getName());
        
        addMetaData();
        for (HumanHbMeasure anemic : anemics) {
            addTitle();
            addHead(anemic);
            addQuestions();
            getDocument().newPage();
        }
        
        close();
        export();
    }
    
    private void addMetaData() {
        getDocument().addTitle("Questionário da Anemnese");
        getDocument().addSubject("Hb");
        getDocument().addKeywords("Questionário, Anemnese, HB, Anemia, TAG, IPTI");
        getDocument().addAuthor("Instituto de Pesquisa em Tecnologia e Inovação - IPTI");
        getDocument().addCreator("Tecnologia de Apoio a Gestão - TAG");
    }

    private void addTitle() throws DocumentException {
        Paragraph preface = new Paragraph();
        Paragraph title = new Paragraph("Prefeitura de Santa Luzia do Itanhi", getCatFont());
        title.setAlignment(Paragraph.ALIGN_CENTER);
        preface.add(title);

        Paragraph subTitle = new Paragraph("Questionário da Anemnese", getSubFont());
        subTitle.setAlignment(Paragraph.ALIGN_CENTER);
        preface.add(subTitle);
        
        Paragraph desc = new Paragraph("Tecnologia Social Hb", getSubFont());
        desc.setAlignment(Paragraph.ALIGN_CENTER);
        preface.add(desc);

        addEmptyLine(preface, 1);
        getDocument().add(preface);
    }
    
    public void addHead(HumanHbMeasure anemic) throws DocumentException {
        Paragraph head = new Paragraph();
        Paragraph field = new Paragraph("Nome: ");
        field.add(new Phrase(anemic.getHuman().getName(), getSmallBold()));
        head.add(field);
        
        field = new Paragraph();
        Phrase line = new Phrase("Data de Nascimento: "+CalendarUtil.getFormatedDate(anemic.getHuman().getBirthday()));
        line.add("                Idade: "+ anemic.getHuman().getAge());
        field.add(line);
        head.add(field);
        
        WeightAndHeight wAh = weightAndHeightBO.getLastMeasure(anemic.getHuman());
        field = new Paragraph();
        line = new Phrase("Sexo: "+((anemic.getHuman().getSex().equals(Sex.MALE)) ? "M" : "F"));
        line.add("                Peso: " + ((wAh != null) ? wAh.getWeight() : "Não Aferido"));
        line.add("                Altura: "+ ((wAh != null) ? wAh.getHeight() : "Não Aferido"));
        field.add(line);
        head.add(field);
        
        Hb hb = anemic.getHb1();
        field = new Paragraph();
        line = new Phrase("IMC: "+((wAh != null) ?
                (String.format(Locale.ENGLISH,"%.1f", wAh.getWeight()/(wAh.getHeight() * wAh.getHeight() ) )) : "Não Aferido"));
        line.add("                Hb1: " + ((hb != null) ? hb.getHemoglobineTax() : "Não Aferido"));
        field.add(line);
        head.add(field);
        addEmptyLine(head, 1);
        
        head.setFont(getTextF());
        getDocument().add(head);
    }
    
    private void addQuestions() throws DocumentException, IOException {
        FacesContext facesContext = ServiceUtil.getFacesContext();
        ExternalContext externalContext = facesContext.getExternalContext();
        Image circ = Image.getInstance(externalContext.getRealPath("resources/images/pdf/circ.png"));
        Image tri = Image.getInstance(externalContext.getRealPath("resources/images/pdf/tri.png"));
        Paragraph questions = new Paragraph();
        Paragraph field;
        questions.add(new Paragraph("1 - A criança já foi internada alguma vez?"));
        field = new Paragraph();
        field.add(new Chunk(circ, 0, 0, true));
        field.add(" SIM ( ) NÃO");
        questions.add(field);
        questions.add(new Paragraph("Se SIM, qual foi o motivo? ________________________________________________________"));
        addEmptyLine(questions, 1);
        questions.add(new Paragraph("2 - Já teve Pneumonia?"));
        questions.add(new Paragraph("( ) SIM ( ) NÃO"));
        field = new Paragraph("Quantas vezes? ");
        field.add(new Chunk(circ, 0, 0, true)); field.add(" 1 "); field.add(new Chunk(circ, 0, 0, true)); field.add(" 2 ");
        field.add(new Chunk(tri, 0, 0, true)); field.add(" 3 "); field.add(new Chunk(tri, 0, 0, true)); field.add(" 4 ou mais");
        questions.add(field);
        addEmptyLine(questions, 1);
        questions.add(new Paragraph("3 - Tem alergia a algum medicamento?"));
        field = new Paragraph();
        field.add(new Chunk(tri, 0, 0, true));
        field.add(" SIM ( ) NÃO");
        questions.add(field);
        questions.add(new Paragraph("Qual: _________________________________________________________________________"));
        addEmptyLine(questions, 1);
        questions.add(new Paragraph("4 - Inchava os pés ou as mãos quando era um bebê?"));
        field = new Paragraph();
        field.add(new Chunk(tri, 0, 0, true));
        field.add(" SIM ( ) NÃO");
        questions.add(field);
        addEmptyLine(questions, 1);
        questions.add(new Paragraph("5 - Sente dor nas pernas com muita frequência?"));
        field = new Paragraph();
        field.add(new Chunk(tri, 0, 0, true));
        field.add(" SIM ( ) NÃO");
        questions.add(field);
        addEmptyLine(questions, 1);
        questions.add(new Paragraph("6 - Já fez exame de sangue?"));
        questions.add(new Paragraph("( ) SIM ( ) NÃO"));
        addEmptyLine(questions, 1);
        questions.add(new Paragraph("7 - Já teve anemia anteriormente?"));
        questions.add(new Paragraph("( ) SIM ( ) NÃO"));
        field = new Paragraph("Quantas vezes? ");
        field.add(new Chunk(circ, 0, 0, true)); field.add(" 1 "); field.add(new Chunk(circ, 0, 0, true)); field.add(" 2 ");
        field.add(new Chunk(tri, 0, 0, true)); field.add(" 3 "); field.add(new Chunk(tri, 0, 0, true)); field.add(" 4 ou mais");
        questions.add(field);
        questions.add(new Paragraph("Como foi tratada? ( ) Sulfato Ferroso ( ) Dieta ( ) Outros: _______________"));
        questions.add(new Paragraph("Melhorou com o tratamento: ( ) SIM ( ) NÃO ( ) Não completou o tratamento"));
        addEmptyLine(questions, 1);
        questions.add(new Paragraph("8 - Existem outras pessoas na família que têm ou já tiveram anemia?"));
        field = new Paragraph();
        field.add(new Chunk(circ, 0, 0, true));
        field.add(" SIM ( ) NÃO");
        questions.add(field);
        questions.add(new Paragraph("Se SIM, quem? ( ) Irmão(a) ( ) Pai ou Mãe ( ) Outros: _________"));
        addEmptyLine(questions, 1);
        questions.add(new Paragraph("Obs.:"));
        addEmptyLine(questions, 1);
        
        questions.setFont(getTextF());
        getDocument().add(questions);
    }
}
